ひとりNavigation API Advent Calendar 11日目
https://gyazo.com/f26d83a36ac64d39808f84c0c7157f54
これはひとりNavigation API Advent Calendarの11日目です
ひとりNavigation API Advent Calendar 10日目に引き続きNavigation APIの仕様についてをみていきます
Navigationインターフェイスの続き
イベントハンドラー関連
table:イベントハンドラ
Event handler Event handler event type
onnavigate navigate
onnavigatesuccess navigatesuccess
onnavigateerror navigateerror
oncurrententrychange currententrychange
code:onvagigate.js
onnavigate = (event) => { }
addEventListener("navigate", (event) => { })
code:onnavigatesuccess.js
onnavigatesuccess = (event) => { }
addEventListener("navigatesuccess", (event) => { })
code:onnavigateerror.js
onnavigateerror = (event) => { }
addEventListener("navigateerror", (event) => { })
code:oncurrententrychange.js
oncurrententrychange = (event) => { }
addEventListener("currententrychange", (event) => { })
NavigationTransition
navigation.transition ... ウェブページの移動(ナビゲーション)が始まったけど、まだ完全に終わっていない時に使える情報
navigation.transition.navigationType
"push"、"replace"、"reload"、"traverse"のいずれかを示す
navigation.transition.from
遷移元となったNavigationHistoryEntry
navigation.currentEntryと比較するのに使える
navigation.transition.to
NavigationDestinationの遷移先
現在のナビゲーション先のURLを反映させる時に使う
navigation.transition.committed
ナビゲーションとURLが変更され、navigation.currentEntryが更新された時に解決されるPromise
すべてのprecommitハンドラーが実行された後に発生
一つ以上のprecommitハンドラーが拒否した場合、Promiseは拒否される
navigation.transition.finished
ナビゲート成功イベントの発火と同時に発行されるPromise
またはナビゲート失敗イベントの発火と同時に拒否されるPromise
NavigationActivaition
navigation.activation ... ウェブページ(ドキュメント)がどのように表示されたか、別のページから移動して表示された場合の情報
navigation.activation.entry
ドキュメントがアクティブになった瞬間(例えば、ページが読み込まれた時)のnavigation.currentEntryの値を保持
navigation.activation.from
あるページから別のページへ移動する際に、移動元のページの履歴情報を保持するNavigationHistoryEntryを保持
前のページが現在のページと異なるウェブサイト(異なるオリジン)であったり、最初に表示された空白のページ(about:blank)であったりした場合は、この情報が null(情報がない)になる
location.replace()(現在のページを置き換える)や history.replaceState()(履歴を置き換える)を使うと、前のページの情報は残らないことがある
ただし、前のページのURLや状態は、urlプロパティや getState() メソッドでアクセスできる場合がある
navigation.activation.navigationType
"push"、"replace"、"reload"、"traverse"のいずれかを示す
NavigationEvent
event.navigationType
"push"、"replace"、"reload"、"traverse"(以下略)
event.destination
ナビゲーションにおける行き先を示すオブジェクト
NavigationDestination
event.canIntercept
intercept()を使って、ページ全体を移動するのではなく、ページ内の一部分だけを変更するような動き (同じドキュメント内のナビゲーション) にできるかどうかを示す
使える場合
基本的に、現在のウェブページのURLを、移動先のURLに書き換えることができる場合に "true" になる
使えない場合
異なるウェブページへの移動 ("traverse")の場合は、常に "false"になる
別のページに移動するため、ページ内の一部分だけを変更するという方法では対応できないため
event.userInitiated
ユーザーがa要素をクリックしたり、form要素を送信したり、ブラウザのUIを使ってナビゲーションした結果である場合はtrue
それ以外の場合はfalse
event.hashChange
フラグメントナビゲーションの場合はtrue
それ以外の場合はfalse
event.signal
ブラウザのナビゲーションが途中でキャンセルされた場合に発生するAbortSignal
例えば、ユーザーがブラウザの「停止」ボタンを押した場合や、別のナビゲーションによって中断された場合など
event.formData
このナビゲーションが、POSTフォーム送信を表す「push」または「replace」ナビゲーションである場合、送信されたフォームエントリを表すFormData
そうでない場合はnullを返す
event.downloadRequest
a要素またはarea要素のdownload属性によってダウンロードとしてリクエストされたかどうかを示す
リクエストされなかった場合はnull
リクエストされた場合はdownload属性の値として指定されたファイル名を返す
ただし現状のdownload挙動がおかしい部分がありNavigation API側でも保障されてるわけではない
<a download> can sometimes just navigate · Issue #7718 · whatwg/html · GitHub
<a download> が期待どおりに動作しないケースがある
ブラウザ間で挙動が非互換
ChromeとFirefoxとで差異がある
逆にリクエストされていなくても、サーバーからの応答(Content-Disposition: attachmentヘッダー)によってダウンロードになる
ブラウザのUI機能(例えば右クリックしてリンク先を保存する場合)を使用して開始されたダウンロードの場合、navigateイベントは一切発生しない
event.info
Navigation APIのメソッドのいずれかを介して渡された任意のJavaScriptの値
ナビゲーションがユーザーによって開始された場合、または別のAPIによって開始された場合はundefined
event.hasUAVisualTransition
ユーザーエージェント判定でView Transitionsが実行されたらtrueを返す
event.sourceElement
ナビゲーションの原因となった要素を返す
a 要素または area 要素、送信ボタン、あるいは送信されたフォーム要素のいずれかになる
event.scroll()
"traverse" または "reload" の場合、ブラウザの通常のスクロール復元ロジックを使ってスクロール位置を復元する
yamanoku.icon scroll restoration logicってのがあるんけ
"push" または "replace" ナビゲーションの場合、スクロール位置をドキュメントの先頭にリセットするか、destination.url にフラグメント識別子が含まれている場合はその位置までスクロールする
このメソッドが複数回呼び出された場合、または scroll オプションが "after-transition" のままで自動的な遷移後スクロール処理がすでに行われた後に呼び出された場合、あるいはナビゲーションがコミットされる前に呼び出された場合には、"InvalidStateError" の DOMException がスローされる
intercept()が激アツ部分なのでこれは明日じっくり見ます